MOVAPDmnemonicMove Aligned Packed Double-Precision Floating-Point Values,原样复制 128 位数据。
MOVAPD 是 SSE2 的 128 位复制指令,通常把一个 XMM 寄存器理解成两个 float64。它不会解析或改变浮点值,因此同样可以原样搬运任意 128 位位模式。
MOVAPD 02xmm0, 03xmm1/m128MOVAPDmnemonicMove Aligned Packed Double-Precision Floating-Point Values,原样复制 128 位数据。
xmm0destination接收源 XMM 寄存器或 128 位内存中的全部位。
xmm1/m128source可以是 XMM 寄存器;使用内存源时,地址必须按 16 字节对齐。
MOVAPD 02xmm1/m128, 03xmm0MOVAPDmnemonic存储形式使用另一个操作码,但仍然原样复制 128 位。
xmm1/m128destination可以是 XMM 寄存器或按 16 字节对齐的 128 位内存位置。
xmm0source提供要写入目标的全部 128 位。
传统 MOVAPD 访问内存时要求 16 字节对齐。图中的两个 64 位 lane 只是便于阅读的分组;复制本身以完整的 128 位位模式为准。
内存操作数必须按 16 字节对齐[127:0][127:0]load: XMM_DEST[127:0] = SRC[127:0]
store: DEST[127:0] = XMM_SRC[127:0]寄存器到寄存器的形式不检查地址对齐。内存源或内存目标不是 16 字节对齐时,传统 MOVAPD 会触发 #GP;需要接受非对齐地址时使用 MOVUPD。
section .data
align 16
input: dq 1.5, -2.0
output: times 2 dq 0.0
section .text
movapd xmm0, [input] ; 66 0F 28:对齐加载
movapd [output], xmm0 ; 66 0F 29:对齐存储两个指针都必须满足 16 字节对齐;数组可使用 alignas(16) 明确声明该约束。
| 形式 | 宽度 | 内存对齐 | 指令集 | 目标寄存器高位 |
|---|---|---|---|---|
MOVAPD xmm, xmm/m128 | 128 位 | 16 字节 | SSE2 | XMM 以上对应位保持不变 |
VMOVAPD xmm, xmm/m128 | 128 位 | 16 字节 | AVX | 高于 128 位的对应目标位清零 |
VMOVAPD ymm, ymm/m256 | 256 位 | 32 字节 | AVX | 高于 256 位的对应目标位清零 |
VMOVAPD zmm, zmm/m512 | 512 位 | 64 字节 | AVX-512F / AVX10.1 | 写入完整 ZMM |
128/256 位 EVEX 形式还需要 AVX-512VL(或相应 AVX10 支持),并可使用写掩码。对齐要求随内存操作数宽度增加,不应把传统 XMM 形式的 16 字节规则套到 YMM 或 ZMM。
MOVAPD 不修改 EFLAGS,也不产生 SIMD 浮点异常。
